#include "VentanaMenuMultijugador.h"

VentanaMenuMultijugador::VentanaMenuMultijugador(Cliente* cliente) {
	_cliente = cliente;
	_ventanaMensaje = NULL;
	_ventanaJuego = NULL;
	_ventanaCrearPartida = NULL;

	set_title("Menu multijugador");
	set_position(Gtk::WIN_POS_CENTER);
	set_resizable(false);
	set_border_width(10);

	_unirsePartidaButton.signal_clicked().connect(sigc::mem_fun(
			*this, &VentanaMenuMultijugador::on_unirse_partida_clicked));
	_crearPartidaButton.signal_clicked().connect(sigc::mem_fun(
			*this, &VentanaMenuMultijugador::on_crear_partida_clicked));
	_unirsePartidaButton.set_focus_on_click(false);
	_crearPartidaButton.set_focus_on_click(false);

	_grilla.set_halign(Gtk::ALIGN_CENTER);
	_grilla.set_column_spacing(10);
	_grilla.set_row_spacing(10);

	Gtk::Label* etiqueta;

	etiqueta = Gtk::manage(new Gtk::Label("Partidas:", Gtk::ALIGN_CENTER));
	_grilla.attach(*etiqueta, 0, 0, 1, 1);
	_grilla.attach_next_to(_partidas, *etiqueta, Gtk::POS_RIGHT, 3, 1);

	_unirsePartidaButton.set_label("Unirse a la partida seleccionada");
	_grilla.attach(_unirsePartidaButton, 1, 1, 2, 1);

	_crearPartidaButton.set_label("Crear una partida");
	_grilla.attach(_crearPartidaButton, 1, 2, 2, 1);

	add(_grilla);

	// Le pedimos las partidas al cliente y las cargamos al combo box
    try {
        vector<string> vectorPartidas = _cliente->listarPartidas();
        _cargarPartidasAlComboBox(vectorPartidas);
    } catch (Excepcion& pEx) {
        // TODO
    }

	show_all_children(true);
	show_all();
}

void VentanaMenuMultijugador::_cargarPartidasAlComboBox(
		std::vector<std::string>& vectorPartidas) {
	_partidas.remove_all();
	std::vector<std::string>::iterator it;

	for (it = vectorPartidas.begin(); it != vectorPartidas.end(); ++it) {
		_partidas.append(*it);
	}
}

void VentanaMenuMultijugador::on_unirse_partida_clicked() {
	std::string partida = _partidas.get_active_text();

	try {
		Partida* partidaAUnirse = _cliente->unirAPartida(partida);

		unsigned int alto =
				partidaAUnirse->ArenaJuego()->getPerimetro()->getAlto();
		unsigned int ancho =
				partidaAUnirse->ArenaJuego()->getPerimetro()->getAncho();

		if (_ventanaJuego) delete _ventanaJuego;
		_ventanaJuego = new VentanaJuego(_cliente, ancho, alto);

		_ventanaJuego->Iniciar();
		this->hide();
	}
	catch (Excepcion& pEx) {
		if (_ventanaMensaje) delete _ventanaMensaje;

		std::string mensaje = "No se puede conectar a la partida '";
		mensaje += partida;
		mensaje += "'.";

		_ventanaMensaje = new VentanaMensaje(mensaje, this);
	}
}

void VentanaMenuMultijugador::on_crear_partida_clicked() {
	if (_ventanaCrearPartida) delete _ventanaCrearPartida;
	hide();
	_ventanaCrearPartida = new VentanaMenuCliente(_cliente);
}

VentanaMenuMultijugador::~VentanaMenuMultijugador() { }